#include "myhead.h"

int ShowJpg(int * map , const char * FilePath , int strat_x , int start_y , int scale_num, int scale_denom)
{
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;

    //1.定义解码对象以及定义错误处理对象，并且进行初始化
    cinfo.err = jpeg_std_error(&jerr); //把错误处理对象以及解码对象进行关联
	jpeg_create_decompress(&cinfo);

    //2.指定需要解码的文件，必须以二进制方式打开
    FILE * infile;

	if ((infile = fopen(FilePath, "rb")) == NULL) {
	    fprintf(stderr, "can't open %s\n", FilePath);
	    exit(1);
	}

	jpeg_stdio_src(&cinfo, infile); //把解码文件和定义了解码对象进行关联

    //3.读取要解码的JPEG图片的文件头
    jpeg_read_header(&cinfo, TRUE);

    //4.设置解码参数，如果不设置则使用默认值即可 （可选）
    cinfo.scale_num = scale_num;
    cinfo.scale_denom = scale_denom;
  
    //5开始解码
    jpeg_start_decompress(&cinfo);

    //申请了一块内存，内存的大小就是JPEG图片一行的数据大小 = 宽像素 * 色深 
    int row_stride;		       
    row_stride = cinfo.output_width * cinfo.output_components; 
    
    unsigned char * buffer = (unsigned char *) malloc(row_stride);//申请一行大小的堆内存，用户来存储读取的一行数据
    unsigned int * p = map;  //防止地址丢失
    unsigned int data = 0;  //为了存储一个像素点的颜色分量

    //6.循环读取JPEG图片的每一行的数据
    while (cinfo.output_scanline < cinfo.output_height) 
    {
        //每次只扫描一行
        jpeg_read_scanlines(&cinfo, &buffer, 1);

        //扫描一行数据，并写入到LCD，需要自行修改  JPEG图片的像素的存储顺序 RGB 
        int i = 0;
        for(i=0;i < cinfo.output_width;i++)
        {
            data |= buffer[i*3]<<16;   //R
            data |= buffer[i*3+1]<<8;  //G
            data |= buffer[i*3+2];     //B

            *(p + strat_x + start_y*800 + (cinfo.output_scanline-1)*800+i) = data;

            data = 0;
        } 
    }

    //7.解码完成
    jpeg_finish_decompress(&cinfo);
    
    //8.释放对象
    jpeg_destroy_decompress(&cinfo);
    fclose(infile);
    free(buffer);
 
    return 0;
}


void Lcd_Show_Color(int x_start,int y_start,int length,int width,int color)
{
    int x = 0;
    int y = 0;
	//映射到addr中
    for(y = y_start;y < y_start+width;y++)
    {
        for(x = x_start;x < x_start+length;x++)
        {
            *(map+x+800*y) = color;
        }
    }
    
	return;
}